Créer une autorité de certification racine (Root CA) avec OpenSSL

Si vous avez un serveur Linux ou un VPS (machine virtuelle sur Internet) et que vous souhaitez sécuriser plusieurs services (web, mails, ...), il devient très intéressant d'utiliser une autorité de certification. Grâce à cette autorité de certification, il vous suffira d'importer le certificat de votre autorité de certification dans les autorités de confiance de vos périphériques (ordinateurs, smartphones, ...) pour que tous vos certificats soient considérés comme émanant d'une autorité reconnue.

Sommaire

1. Installation d'OpenSSL

2. Création de l'autorité de certification (CA)

3. Création d'une demande de signature de certificat

4. Création du certificat depuis la demande de signature

5. Sécuriser Apache avec le certificat SSL

6. Test de la configuration

7. Importer le certificat de l'autorité dans les PC Linux

8. Importer le certificat de l'autorité dans les PC Windows

9. Révoquer un certificat

10. Création de la liste de révocation (CRL)

11. Rendre la liste de révocation accessible depuis le web

12. Test de la révocation

 

1. Installation d'OpenSSL

Par sécurité, faites une mise à jour de la liste des paquets.

apt-get update

Puis, installez le paquet "openssl".

 

apt-get install openssl

2. Création de l'autorité de certification (CA)

Pour modifiez les informations qu'OpenSSL utilisera pour créer l'autorité de certification, modifiez le fichier "/etc/ssl/openssl.cnf".

Dans ce fichier, vous pourrez modifiez la durée de validité des certificats que vous signerez.
Par exemple : 10 ans (3650 jours).

default_days = 3650

 

Modifier la taille de la clé utilisée. Pour information : Geotrust demande maintenant des certificats en 2048 bits. Donc, autant faire comme eux.

default_bits = 2048

Ainsi, que les informations de votre autorité de certification. Dont celles-ci :

 

# Le code du pays.

countryName_default = BE

# L'état ou la province. Perso, j'ai mis le pays pour protéger ma vie privée.

stateOrProvinceName_default = Belgique

# Le nom de votre organisation (ou le nom de votre site si vous le souhaitez).

0.organizationName_default = InformatiWeb

# Dans la partie "[ usr_cert ]", ajoutez la ligne suivante :

crlDistributionPoints=URI:http://www.informatiweblan.net/ca-crl.crl

# Doc : https://www.openssl.org/docs/apps/x509v3_config.html#crl_distribution_points_

Pour finir, créer votre autorité de certification en utilisant le script "CA.sh" d'OpenSSL.

 

cd /usr/lib/ssl/misc/

sudo ./CA.sh -newca

Lors de la création de l'autorité de certification, le script vous demandera :
- un mot de passe pour protéger la clé privée de l'autorité de certification
- les informations à indiquer dans le certificat de l'autorité

Note : Le nom commun a indiquer lors de la création de l'autorité de certification est le nom de votre autorité de certification.

...

writing new private key to './demoCA/private/./cakey.pem'

Enter PEM pass phrase:

Verifying - Enter PEM pass phrase:

...

Country Name (2 letter code) [BE]:

State or Province Name (full name) [Belgique]:

Locality Name (eg, city) []:

Organization Name (eg, company) [InformatiWeb]:

Organizational Unit Name (eg, section) []:

Common Name (e.g. server FQDN or YOUR name) []:InformatiWeb CA

Email Address []:

 

Please enter the following 'extra' attributes

to be sent with your certificate request

A challenge password []:

An optional company name []:

Dans le dossier "/usr/lib/ssl/misc/demoCA" qui a été créé par ce script, vous trouverez tous les fichiers concernant votre autorité de certification.
Dont le certificat de l'autorité : "cacert.pem".

ls -l /usr/lib/ssl/misc/demoCA/

total 40

-rw-r--r-- 1 root root 4309 fév 11 16:14 cacert.pem

-rw-r--r-- 1 root root  972 fév 11 16:14 careq.pem

drwxr-xr-x 2 root root 4096 fév 11 16:14 certs

drwxr-xr-x 2 root root 4096 fév 11 16:14 crl

-rw-r--r-- 1 root root   94 fév 11 16:14 index.txt

-rw-r--r-- 1 root root   21 fév 11 16:14 index.txt.attr

-rw-r--r-- 1 root root    0 fév 11 16:14 index.txt.old

drwxr-xr-x 2 root root 4096 fév 11 16:14 newcerts

drwxr-xr-x 2 root root 4096 fév 11 16:14 private

-rw-r--r-- 1 root root   17 fév 11 16:14 serial

3. Création d'une demande de signature de certificat

Pour prendre un exemple courant, nous allons demander un certificat qui aura ces caractéristiques :
- valable 10 ans
- valide pour tous les sous-domaines (sauf le domaine)
- clé privée non protégée par mot de passe pour éviter qu'Apache ne le demande au démarrage (ou redémarrage en cas de problèmes)

openssl req -new -nodes -keyout /etc/ssl/private/www-key.pem -out /tmp/www-req.pem -days 3650

Comme tout à l'heure, des informations vous seront demandées.
Parmi ces informations, vous devez obligatoirement indiquer "*.domaine.net" pour le nom commun car c'est cette valeur que le navigateur web vérifiera.
Note : Pour générer un certificat valable pour le domaine uniquement, indiquez "domaine.net" pour le nom commun.

Generating a 2048 bit RSA private key

............+++

..........+++

writing new private key to 'www-key.pem'

-----

You are about to be asked to enter information that will be incorporated

into your certificate request.

What you are about to enter is what is called a Distinguished Name or a DN.

There are quite a few fields but you can leave some blank

For some fields there will be a default value,

If you enter '.', the field will be left blank.

-----

Country Name (2 letter code) [BE]:

State or Province Name (full name) [Belgique]:

Locality Name (eg, city) []:

Organization Name (eg, company) [InformatiWeb]:

Organizational Unit Name (eg, section) []:

Common Name (e.g. server FQDN or YOUR name) []:*.informatiweblan.net

Email Address []:

 

Please enter the following 'extra' attributes

to be sent with your certificate request

A challenge password []:

An optional company name []:

4. Création du certificat depuis la demande de signature

Pour finir, utilisez la demande de signature pour signer le certificat.

cd /usr/lib/ssl/misc/

openssl ca -out /etc/ssl/certs/www-cert.pem -infiles /tmp/www-req.pem

Using configuration from /usr/lib/ssl/openssl.cnf

Enter pass phrase for ./demoCA/private/cakey.pem:

Check that the request matches the signature

Signature ok

Certificate Details:

Serial Number:

92:41:c8:a0:fa:43:33:f6

Validity

Not Before: Feb 11 15:30:52 2015 GMT

Not After : Feb  8 15:30:52 2025 GMT

Subject:

countryName               = BE

stateOrProvinceName       = Belgique

organizationName          = InformatiWeb

commonName                = *.informatiweblan.net

X509v3 extensions:

X509v3 Basic Constraints:

CA:FALSE

Netscape Comment:

OpenSSL Generated Certificate

X509v3 Subject Key Identifier:

9E:24:79:43:C8:90:6E:9E:52:4A:80:8C:35:32:92:AC:66:CD:20:F6

X509v3 Authority Key Identifier:

keyid:10:44:64:86:EB:FE:F1:52:10:8A:0B:EF:2C:49:EE:DC:F0:1C:B3:2F

 

Certificate is to be certified until Feb  8 15:30:52 2025 GMT (3650 days)

Sign the certificate? [y/n]:y

 

1 out of 1 certificate requests certified, commit? [y/n]y

Write out database with 1 new entries

Data Base Updated

5. Sécuriser Apache avec le certificat SSL

Dans la configuration d'un site sécurisé avec SSL, vous indiquerez les lignes suivantes :

SSLEngine on

SSLCertificateFile    /etc/ssl/certs/www-cert.pem

SSLCertificateKeyFile /etc/ssl/private/www-key.pem

Pour plus d'informations sur la sécurisation d'un serveur web Apache, lisez notre tutoriel "Sécurisation du serveur web Apache".

6. Test de la configuration

Si vous tentez d'accéder à la partie sécurisée de votre site via le protocole https, vous aurez un avertissement "Cette connexion n'est pas certifiée".
Ce qui est tout à fait normal étant donné que notre autorité de certification n'est pas reconnue par défaut. Pour établir cette confiance, l'utilisateur doit ajouter le certificat de votre autorité dans la liste des autorités de certification de confiance de son ordinateur (ou smartphone, ...).

 

7. Importer le certificat de l'autorité dans les PC Linux

Pour les PC Linux, pas de problème. Il suffit de copier le certificat de l'autorité (uniquement le certificat) dans l'espace web de votre serveur.

cp /usr/lib/ssl/misc/demoCA/cacert.pem /var/www/

Ensuite, sur les pc clients, accédez à l'adresse : http://www.informatiweblan.net/cacert.pem
Note : Il faut utiliser le protocole http pour télécharger le certificat car la version https est bloquée par l'avertissement.

Le navigateur web vous demandera de confirmer cette nouvelle autorité.
Si utilisez des certificats uniquement pour vos sites web, cochez uniquement la première case.
Sinon, cochez aussi les autres cases si besoin (pour les protocoles imap et pop3 de votre serveur de messagerie, par exemple).

 

Le navigateur web n'affichera plus d'avertissement pour les certificats que vous signerez avec votre autorité de certification.

 

8. Importer le certificat de l'autorité dans les PC Windows

Pour les PC Windows, vous devez convertir le certificat .pem en .cer (format microsoft).
Pour cela, faites la conversion sur le serveur grâce à "OpenSSL".

cd /usr/lib/ssl/misc/demoCA

openssl x509 -inform PEM -in cacert.pem -outform DER -out cacert.cer

Puis, copiez cette version du certificat dans l'espace web de votre serveur.

cp /usr/lib/ssl/misc/demoCA/cacert.cer /var/www/

Ensuite, sur les pc clients, téléchargez le certificat de votre autorité de certification à l'adresse : http://www.informatiweblan.net/cacert.cer
Note : Il faut utiliser le protocole http pour télécharger le certificat car la version https est bloquée par l'avertissement.

 

 

Ouvrez le certificat et cliquez sur "Installer le certificat".

 

Cliquez sur "Parcourir" et sélectionnez le magasin "Autorités de certification racines de confiances".

 

Confirmez l'importation du certificat de votre autorité de certification en cliquant sur "Oui".

 
 

Les navigateurs web "Internet Explorer" et "Google Chrome" utilisent le magasin de certificats de Windows. Vous n'aurez donc plus d'avertissement pour vos certificats sur ces navigateurs web.

 

Pour Mozilla Firefox, ouvrez ce navigateur et allez dans le menu (les 3 lignes horizontales) -> Options -> Avancé -> Certificats -> Afficher les certificats -> Autorités.
Ensuite, cliquez sur le bouton "Importer" et sélectionnez le certificat de votre autorité.

 

Le navigateur web vous demandera de confirmer cette nouvelle autorité.
Si utilisez des certificats uniquement pour vos sites web, cochez uniquement la première case.
Sinon, cochez aussi les autres cases si besoin (pour les protocoles imap et pop3 de votre serveur de messagerie, par exemple).

 

Maintenant, Mozilla Firefox n'affichera plus d'avertissements pour les certificats signés par votre autorité.

 

9. Révoquer un certificat

Pour finir ce tutoriel sur la création et l'utilisation d'une autorité de certification sous Linux, voici comment révoquer un certificat.
En d'autres termes : rendre un certificat invalide pour une raison ou pour une autre.

cd /usr/lib/ssl/misc

openssl ca -revoke /etc/ssl/certs/www-cert.pem

Note : OpenSSL vous demandera le mot de passe de la clé privée de l'autorité pour révoquer le certificat souhaité.

Using configuration from /usr/lib/ssl/openssl.cnf

Enter pass phrase for ./demoCA/private/cakey.pem:

Revoking Certificate 9241C8A0FA4333F6.

Data Base Updated

10. Création de la liste de révocation (CRL)

Créez le fichier "crlnumber".

echo 1000 > /usr/lib/ssl/misc/demoCA/crlnumber

Puis, créer la liste de révocation (CRL)

cd /usr/lib/ssl/misc

openssl ca -gencrl -out demoCA/crl/ca-crl.pem

Conformément à la norme "RFC 5280", la liste de révocation doit être encodée en DER :

Extrait :

If the DistributionPointName contains a general name of type URI, the following semantics MUST be assumed: the URI is a pointer to the current CRL for the associated reasons and will be issued by the associated cRLIssuer. When the HTTP or FTP URI scheme is used, the URI MUST point to a single DER encoded CRL as specified in [RFC2585].

Pour encoder cette liste au format DER, utilisez OpenSSL comme ceci :

openssl crl -inform PEM -in demoCA/crl/ca-crl.pem -outform DER -out demoCA/crl/ca-crl.crl

11. Rendre la liste de révocation accessible depuis le web

Pour cela, copiez ce fichier "ca-crl.crl" dans l'espace web de votre serveur.

cp /usr/lib/ssl/misc/demoCA/crl/ca-crl.crl /var/www/ca-crl.crl

12. Test de la révocation

Pour éviter que le cache ne pose problème pour ce test, nous allons vider le cache des listes de révocation de Windows.
Cela vous évitera d'avoir un certificat révoqué non reconnu comme révoqué.

Pour cela, tapez ces 2 commandes dans un "invite de commandes" lancé en tant qu'administrateur.

Vide le cache de CRL (les listes de révocations de certificats) du disque dur :

certutil -URLCache CRL –delete

Invalide l'utilisation des CRL en cache dans la mémoire et sur le disque dur :

certutil –setreg chain\ChainCacheResyncFiletime @now

Et enfin, videz le cache de votre navigateur. Ainsi, la révocation sera prise en compte directement.

Après 2-3 minutes, Internet Explorer ainsi que les autres navigateurs vont bloquer l'accès à votre site car le certificat a été révoqué.
Voici l'erreur sous Internet Explorer.